
 /**
 * 上海中赢金融信息服务有限公司
 * Copyright (c) 2017-2027 Chinazyjr,Inc.All Rights Reserved.
 */
package com.sys.midware.redis.core.operation;

import java.util.Set;

import com.sys.midware.redis.core.operation.impl.ZSetTuple;

/**
 * <b>Description：</b> 按权重排序的set <br/>
 * <b>ClassName：</b> ZSetOperations <br/>
 * <b>@author：</b> jackyshang <br/>
 * <b>@date：</b> 2016年8月22日 下午4:02:12 <br/>
 * <b>@version: </b>  <br/>
 */
public interface ZSetOperations {
    
    /**
     * 新增一个带分数的有序集合
     * add <br/> 
     * @param key
     * @param tupleSet
     * @return  Boolean <br/>
     */
    public <K, V> Long add(K key, Set<ZSetTuple<V>> tupleSet);
    /**
     * 向有序集合中新增一条记录
     * add <br/> 
     * @param key
     * @param value
     * @param score
     * @return  Boolean <br/>
     */
    public <K,V> Long add(K key, V value, double score);
    /**
     * 改变权重
     * incrementScore <br/> 
     * @param key
     * @param value
     * @param delta
     * @return  Double <br/>
     */
    public <K,V> Double incrementScore(K key, V value, final double delta);
    /**
     * 获取有序结合的数量
     * size <br/> 
     * @param key
     * @return  Long <br/>
     */
    public <K,V> Long size(K key);
    
    /**
     * 删除有序集合成员数据
     * delete <br/> 
     * @param key
     * @param values  void <br/>
     */
    public <K,V> Long delete(K key,Object... values);
    /**
     * 按照范围删除有序集合成员
     * delete <br/> 
     * @param key
     * @param start
     * @param end
     * @return  Long <br/>
     */
    public <K,V> Long delete(K key, final long start, final long end) ;
    /**
     * 按照分数范围删除成员
     * deleteByScoreRange <br/> 
     * @param key
     * @param min
     * @param max
     * @return  Long <br/>
     */
    public <K,V> Long deleteByScoreRange(K key, final double min, final double max) ;
    /**
     * 获取成员分数
     * getScore <br/> 
     * @param key
     * @param o
     * @return  Double <br/>
     */
    public <K,V> Double getScore(K key, Object o);
    /**
     * 获取成员排名（升序）
     * getRank <br/> 
     * @param key
     * @param o
     * @return  Long <br/>
     */
    public <K,V> Long getRank(K key, Object o);
    /**
     * 获取对象排名（降序）
     * getRank <br/> 
     * @param key
     * @param o
     * @return  Long <br/>
     */
    public <K,V> Long getReverseRank(K key, Object o);
    
    /**
     * 获取集合所有成员
     * getAll <br/> 
     * @param key
     * @return  Set<V> <br/>
     */
    public <K,V> Set<V> getAll(K key);
    /**
     * 获取集合所有带分数的成员
     * getAllWithScore <br/> 
     * @param key
     * @return  Set<TypedTuple> <br/>
     */
    public <K,V> Set<ZSetTuple<V>> getAllWithScore(K key);
    
    /**
     * 根据分数范围获取数据
     * getByScore <br/> 
     * @param key
     * @param min
     * @param max
     * @return  Set<V> <br/>
     */
    public <K,V> Set<V> getByScoreRange(K key, final double min, final double max);
    /**
     * 根据分数排名范围获取带分数的数据
     * getByScoreRange <br/> 
     * @param key
     * @param min
     * @param max
     * @return  Set<TypedTuple> <br/>
     */
    public <K,V> Set<ZSetTuple<V>> getByScoreRangeWithScore(K key, final double min, final double max);
 
}
